/**
 * 将数字转为中文大写金额（带单位）
 * @param {number} num - 要转换的数字
 * @param {boolean} [withYuan=true] - 是否包含"元"单位
 * @returns {string} 中文大写金额
 */
export function numberToChinese(num, withYuan = true) {
	if (isNaN(num)) {
		return '不是有效的数字';
	}

	// 处理负数
	if (num < 0) {
		return '负' + numberToChinese(-num, withYuan);
	}

	// 处理小数部分（角分）
	if (num.toString().includes('.')) {
		const parts = num.toString().split('.');
		let integerPart = parseInt(parts[0]);
		let decimalPart = parts[1].substring(0, 2); // 只取前两位（角分）

		let result = numberToChinese(integerPart, true); // 整数部分

		// 处理小数部分
		if (decimalPart.length > 0) {
			// 补全两位小数
			decimalPart = decimalPart.padEnd(2, '0');

			const jiao = parseInt(decimalPart[0]); // 角
			const fen = parseInt(decimalPart[1]); // 分

			if (jiao > 0 || fen > 0) {
				result += '元'; // 确保有元单位

				if (jiao > 0) {
					result += digitToChinese[jiao] + '角';
				}
				if (fen > 0) {
					result += digitToChinese[fen] + '分';
				}

				return result;
			}
		}

		return result + (integerPart === 0 ? '' : '元') + '整';
	}

	// 定义数字对应的大写字符
	const digitToChinese = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
	const unitToChinese = ['', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟', '兆'];

	// 处理0的情况
	if (num === 0) {
		return withYuan ? digitToChinese[0] + '元整' : digitToChinese[0];
	}

	let result = '';
	let strNum = Math.floor(num).toString();
	let len = strNum.length;

	// 记录当前单位级别（用于处理万、亿等单位）
	let currentUnitLevel = 0;

	for (let i = 0; i < len; i++) {
		const digit = parseInt(strNum[i]);
		const unit = len - i - 1;

		// 每4位为一个单位级别（个、万、亿）
		if (unit % 4 === 0 && unit > 0) {
			currentUnitLevel = unit;
		}

		// 当前数字不为0时才添加单位和数字
		if (digit !== 0) {
			result += digitToChinese[digit] + unitToChinese[unit % 4];
		} else {
			// 处理连续的零，只保留一个
			if (result[result.length - 1] !== digitToChinese[0]) {
				result += digitToChinese[0];
			}
		}

		// 在万、亿等单位位置添加单位
		if (unit === currentUnitLevel && unit > 0) {
			// 去除可能多余的零
			result = result.replace(new RegExp(digitToChinese[0] + '$'), '');
			result += unitToChinese[unit];
			currentUnitLevel = 0; // 重置
		}
	}

	// 处理末尾的零
	result = result.replace(/零+$/, '');

	// 处理中间的多个零
	result = result.replace(/零+/g, '零');

	// 处理"壹拾"开头的情况，通常简化为"拾"
	if (result.startsWith('壹拾')) {
		result = result.substring(1);
	}

	// 添加元单位
	if (withYuan && result !== digitToChinese[0]) {
		result += '元';
	}

	// 如果是整数且需要元单位，则添加"整"
	if (withYuan && !num.toString().includes('.') && result !== digitToChinese[0] + '元') {
		result += '整';
	}

	return result || (withYuan ? digitToChinese[0] + '元整' : digitToChinese[0]);
}
/**
 * 获取当前时间并格式化为"2025年8月15日 14时
 */
export function getCurrentTime() {
	const now = new Date();

	// 获取各时间组件并补零
	const year = now.getFullYear();
	const month = String(now.getMonth() + 1).padStart(2, '0');
	const day = String(now.getDate()).padStart(2, '0');
	const hours = String(now.getHours()).padStart(2, '0');

	return `${year}年${month}月${day}日 ${hours}时`;
}

/**
 * 将 ISO 8601 时间字符串格式化为 "YYYY年MM月DD日 HH时mm分ss秒" 或带毫秒的格式
 * @param {string} isoString - ISO 8601 时间字符串（如 "2025-07-09T18:07:23.023"）
 * @param {boolean} [withMilliseconds=false] - 是否包含毫秒
 * @returns {string} 格式化后的时间字符串（如 "2025年7月9日 18时07分23秒"）
 */
export function formatISODateTime(isoString, withMilliseconds = false) {
	const date = new Date(isoString);

	// 检查日期是否有效
	if (isNaN(date.getTime())) {
		throw new Error("Invalid ISO 8601 date string");
	}

	// 提取各时间部分
	const year = date.getFullYear();
	const month = date.getMonth() + 1; // 月份从0开始
	const day = date.getDate();
	const hours = String(date.getHours()).padStart(2, '0');
	const minutes = String(date.getMinutes()).padStart(2, '0');
	const seconds = String(date.getSeconds()).padStart(2, '0');
	const milliseconds = String(date.getMilliseconds()).padStart(3, '0');

	// 拼接结果
	let result = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
	if (withMilliseconds) {
		result = `${result}.${milliseconds}`;
	}

	return result;
}

/**
 * 返回当前时间的字符串，格式如 2025-08-19 15:57:59
 */
export function getCurrentNowTime() {
	const now = new Date();

	const year = now.getFullYear();
	const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始，所以要+1
	const day = String(now.getDate()).padStart(2, '0');
	const hours = String(now.getHours()).padStart(2, '0');
	const minutes = String(now.getMinutes()).padStart(2, '0');
	const seconds = String(now.getSeconds()).padStart(2, '0');

	return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}